package com.wongoing.quartz;

import java.util.List;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.wongoing.sys.model.SysTaskjob;
import com.wongoing.util.LogService;
/**
 * 功能说明：一个控制层管理器，用来封装定时任务的常用方法
 * 修改说明：
 * @author 吴兆强
 * @date 2018年7月9日 上午10:25:50
 * @version V0.1
 */
@Controller
public class QuartzManager {
	
	@Autowired
	private Scheduler quartzScheduler;
	
	/**
	 * 功能说明：使能数据库中的定时任务
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月1日 上午9:39:29
	 * @param jobs
	 */
	public void enableCronSchedule(List<SysTaskjob> jobs) {
		for (SysTaskjob job : jobs) {
			String jobName = job.getJobName();
			String jobGroupName = job.getJobGroup()==null?"defualt":job.getJobGroup();
			String triggerName = job.getJobName() + "Trigger";
			String triggerGroupName = job.getJobName() + "TriggerGroup";
			String  className=	job.getJobClass().trim();
			Class clazz = null;
			try {
				clazz = Class.forName(className);
			} catch (ClassNotFoundException e) {
				LogService.getInstance(this).error("Quartz启动获取class失败：", e);
				continue;
			}
			String cron = job.getJobCronExpression();
			JobDataMap paramsMap = new JobDataMap();
			paramsMap.put("jobName", job.getJobName());
			if(job.getParamKey1()!=null && job.getParamValue1()!=null){
				paramsMap.put(job.getParamKey1(), job.getParamValue1());
			}
			if(job.getParamKey2()!=null && job.getParamValue2()!=null){
				paramsMap.put(job.getParamKey2(), job.getParamValue2());
			}
			if(job.getParamKey3()!=null && job.getParamValue3()!=null){
				paramsMap.put(job.getParamKey3(), job.getParamValue3());
			}
			this.addJob(jobName, jobGroupName, triggerName, triggerGroupName, clazz, cron, paramsMap);
		}
	};
	
	/**
	 * 功能说明：添加一个定时任务
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月3日 下午3:26:13
	 * @param jobName
	 * @param jobGroupName
	 * @param triggerName
	 * @param triggerGroupName
	 * @param clazz
	 * @param cron
	 * @param paramsMap
	 */
	public void addJob(String jobName, String jobGroupName, String triggerName,
			String triggerGroupName, Class clazz, String cron, JobDataMap paramsMap) {
		try {
			// 获取调度器
			Scheduler sched = quartzScheduler;
			// 创建一项作业
			JobDetail job = JobBuilder.newJob(clazz)
					.withIdentity(jobName, jobGroupName).build();
			// 创建一个触发器
			CronTrigger trigger = TriggerBuilder
					.newTrigger()
					.withIdentity(triggerName, triggerGroupName)
					.withSchedule(CronScheduleBuilder.cronSchedule(cron))
					.usingJobData(paramsMap)
					.build();
			// 告诉调度器使用该触发器来安排作业
			sched.scheduleJob(job, trigger);
			// 启动
			if (!sched.isShutdown()) {
				sched.start();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 功能说明：修改一个定时器工作时间
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月3日 下午3:27:16
	 * @param oldjobName
	 * @param oldjobGroup
	 * @param oldtriggerName
	 * @param oldtriggerGroup
	 * @param jobName
	 * @param jobGroup
	 * @param triggerName
	 * @param triggerGroup
	 * @param cron
	 * @return
	 */
	public boolean modifyJobTime(String oldjobName, String oldjobGroup, String oldtriggerName, String oldtriggerGroup, String jobName, String jobGroup,
			String triggerName, String triggerGroup, String cron) {
		try {
			Scheduler sched = quartzScheduler;
			CronTrigger trigger = (CronTrigger) sched.getTrigger(TriggerKey
					.triggerKey(oldtriggerName, oldtriggerGroup));
			if (trigger == null) {
				return false;
			}

			JobKey jobKey = JobKey.jobKey(oldjobName, oldjobGroup);
			TriggerKey triggerKey = TriggerKey.triggerKey(oldtriggerName,
					oldtriggerGroup);

			JobDetail job = sched.getJobDetail(jobKey);
			Class jobClass = job.getJobClass();
			JobDataMap paramsMap = job.getJobDataMap();
			// 停止触发器
			sched.pauseTrigger(triggerKey);
			// 移除触发器
			sched.unscheduleJob(triggerKey);
			// 删除任务
			sched.deleteJob(jobKey);
			
			//重新添加一个新的定时任务
			addJob(jobName, jobGroup, triggerName, triggerGroup, jobClass, cron, paramsMap);
			
			return true;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
	}

	/**
	 * 功能说明：修改定时器时间
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月3日 下午3:27:56
	 * @param triggerName
	 * @param triggerGroupName
	 * @param time
	 */
	public void modifyJobTime(String triggerName, String triggerGroupName,
			String time) {
		try {
			Scheduler sched = quartzScheduler;
			CronTrigger trigger = (CronTrigger) sched.getTrigger(TriggerKey
					.triggerKey(triggerName, triggerGroupName));
			if (trigger == null) {
				return;
			}
			String oldTime = trigger.getCronExpression();
			if (!oldTime.equalsIgnoreCase(time)) {
				CronTrigger ct = (CronTrigger) trigger;
				// 修改时间
				ct.getTriggerBuilder()
						.withSchedule(CronScheduleBuilder.cronSchedule(time))
						.build();
				// 重启触发器
				sched.resumeTrigger(TriggerKey.triggerKey(triggerName,
						triggerGroupName));
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 功能说明：移除一个任务
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月3日 下午3:28:09
	 * @param jobName
	 * @param jobGroupName
	 * @param triggerName
	 * @param triggerGroupName
	 */
	public void removeJob(String jobName, String jobGroupName,
			String triggerName, String triggerGroupName) {
		try {
			Scheduler sched = quartzScheduler;
			// 停止触发器
			sched.pauseTrigger(TriggerKey.triggerKey(triggerName,
					triggerGroupName));
			// 移除触发器
			sched.unscheduleJob(TriggerKey.triggerKey(triggerName,
					triggerGroupName));
			// 删除任务
			sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 功能说明：开始一个定时任务
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月3日 下午3:28:30
	 */
	public void startSchedule() {
		try {
			Scheduler sched = quartzScheduler;
			sched.start();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 功能说明：关闭一个定时任务
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月3日 下午3:28:44
	 */
	public void shutdownSchedule() {
		try {
			Scheduler sched = quartzScheduler;
			if (!sched.isShutdown()) {
				sched.shutdown();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 功能说明：暂停一个定时任务
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月3日 下午3:29:02
	 * @param jobName
	 * @param jobGroupName
	 */
	public void pauseJob(String jobName, String jobGroupName) {
		try {
			quartzScheduler.pauseJob( JobKey.jobKey(jobName, jobGroupName));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	
	}

	/**
	 * 功能说明：重启一个定时任务
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月3日 下午3:29:15
	 * @param jobName
	 * @param jobGroupName
	 */
	public void resumeJob(String jobName, String jobGroupName) {
		try {
			quartzScheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
}
